package com.alquimia.truco.dominio.modelo;

import java.util.EnumSet;
import java.util.Set;
import java.util.stream.Stream;

/**
 * Created by Ivo on 29/06/2014.
 */
public enum Accion implements AccionService {

    ENVIDO() {
        @Override
        public Accion[] obtenerPosiblesAcciones(final Accion[] aAccionesPrevias) {

            long mEnvidosCantados = Stream.of(aAccionesPrevias).filter(e -> e.equals(this)).count();

            if (mEnvidosCantados == 2)
                return new Accion[]{Accion.REAL_ENVIDO, Accion.FALTA_ENVIDO, Accion.QUIERO, Accion.NO_QUIRO};
            else
                return new Accion[]{Accion.ENVIDO, Accion.REAL_ENVIDO, Accion.FALTA_ENVIDO, Accion.QUIERO, Accion.NO_QUIRO};

        }

        @Override
        public boolean esUnaAccionDeFinalizacion() {
            return false;
        }
    },
    REAL_ENVIDO() {
        @Override
        public Accion[] obtenerPosiblesAcciones(final Accion[] aAccionesPrevias) {
            return new Accion[]{Accion.FALTA_ENVIDO, Accion.QUIERO, Accion.NO_QUIRO};
        }

        @Override
        public boolean esUnaAccionDeFinalizacion() {
            return false;
        }
    },
    FALTA_ENVIDO() {
        @Override
        public Accion[] obtenerPosiblesAcciones(final Accion[] aAccionesPrevias) {
            return new Accion[]{Accion.QUIERO, Accion.NO_QUIRO};
        }

        @Override
        public boolean esUnaAccionDeFinalizacion() {
            return false;
        }
    },
    TRUCO() {
        @Override
        public Accion[] obtenerPosiblesAcciones(final Accion[] aAccionesPrevias) {
            return new Accion[]{Accion.RE_TRUCO, Accion.QUIERO, Accion.NO_QUIRO};
        }

        @Override
        public boolean esUnaAccionDeFinalizacion() {
            return false;
        }
    },
    RE_TRUCO() {
        @Override
        public Accion[] obtenerPosiblesAcciones(final Accion[] aAccionesPrevias) {
            return new Accion[]{Accion.VALE_CUATRO, Accion.QUIERO, Accion.NO_QUIRO};
        }

        @Override
        public boolean esUnaAccionDeFinalizacion() {
            return false;
        }
    },
    VALE_CUATRO() {
        @Override
        public Accion[] obtenerPosiblesAcciones(final Accion[] aAccionesPrevias) {
            return new Accion[]{Accion.QUIERO, Accion.NO_QUIRO};
        }

        @Override
        public boolean esUnaAccionDeFinalizacion() {
            return false;
        }
    },
    QUIERO() {
        @Override
        public Accion[] obtenerPosiblesAcciones(final Accion[] aAccionesPrevias) {
            return null;
        }

        @Override
        public boolean esUnaAccionDeFinalizacion() {
            return true;
        }
    },
    NO_QUIRO() {
        @Override
        public Accion[] obtenerPosiblesAcciones(final Accion[] aAccionesPrevias) {
            return null;
        }

        @Override
        public boolean esUnaAccionDeFinalizacion() {
            return true;
        }
    },
    IRSE() {
        @Override
        public Accion[] obtenerPosiblesAcciones(final Accion[] aAccionesPrevias) {
            return null;
        }

        @Override
        public boolean esUnaAccionDeFinalizacion() {
            return true;
        }
    },
    TIRAR_CARTA() {
        @Override
        public Accion[] obtenerPosiblesAcciones(final Accion[] aAccionesPrevias) {
            return null;
        }

        @Override
        public boolean esUnaAccionDeFinalizacion() {
            return false;
        }
    };

    private Accion() {

    }

}
